/* WS 业务逻辑 */
const WebSocket = require('ws')
const SessionRepositories = require('../repositories/sessionRepositiories')
const colors = require('colors')

const wsService = {
  // 处理 Canvas 指纹消息
  handleCanvasFingerprint(ws, data, req) {
    const { canvasFingerprint } = data

    // 从 WebSocket 对象中获取用户信息
    const user = ws.user
    if (!user) {
      ws.send(JSON.stringify({ status: 'error', message: '用户未认证' }))
      return
    }

    // 向客户端发送确认消息
    ws.send(
      JSON.stringify({
        status: 'success',
        message: 'Canvas 指纹已接收',
        canvasFingerprint: canvasFingerprint.slice(0, 10) + '...',
      })
    )

    // 广播 Canvas 指纹给所有客户端
    req.wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(
          JSON.stringify({
            type: 'broadcast',
            message: '新的 Canvas 指纹已接收',
            canvasFingerprint: canvasFingerprint.slice(0, 10) + '...',
            userId: user.id,
          })
        )
      }
    })
  },

  // 处理 WebSocket 连接建立时的逻辑
  async handleConnection(ws, req) {
  const user = ws.user
  if (!user) {
    return
  }

  try {
    // 检查是否已存在会话记录
    const existingSession = await SessionRepositories.getSessionByUserId(user.id)

    if (existingSession) {
      const { expiresAt } = existingSession

      // 检测会话是否过期
      if (new Date(expiresAt) < new Date()) {
        // 会话已过期，关闭连接并退出登录
        ws.close(4001, '会话已过期，请重新登录')
        console.log('会话已过期，关闭连接:', user.id)
        return
      } else {
        // 会话未过期，提示前端账号已在别处登录
        ws.close(4002, '账号已在别处登录')
      }
    } else {
      // 如果不存在会话记录，创建新的会话记录
      await SessionRepositories.addNewSession({
        userId: user.id,
        token: req.headers.cookie.split('token=')[1],
        canvaszw: 'GeZhi', // Canvas 指纹
        expiresAt: new Date(Date.now() + 60 * 60 * 1000), // 1小时后过期
        createdAt: new Date(Date.now()),
        updatedAt: new Date(Date.now()),
      })
      console.log(colors.yellow('会话记录已创建:'), user.id)
    }
  } catch (error) {
    console.log(colors.bgRed('创建或更新会话记录失败:', error))
    ws.close(4001, '会话记录处理失败')
  }
},

// 处理 WebSocket 连接断开时的逻辑
  async handleDisconnect(ws, req) {
    const user = ws.user
    if (!user) {
      return
    }

    try {
      // 删除对应的会话记录
      await SessionRepositories.delSessionByUserId(user.id)
      console.log(colors.bgGreen('会话记录已删除:', user.id))
    } catch (error) {
      console.log(colors.bgRed('删除会话记录失败:', error))
    }
  },

  async handleLogout(userId, timestamp) {
    try {
      // 删除对应的会话记录
      await SessionRepositories.delSessionByUserId(userId)
      console.log(colors.bgGreen(`客户端登出，删除会话记录 - ${userId} - ${timestamp}`))
    } catch (error) {
      console.log(colors.bgRed('客户端登出，会话记录删除失败' + timestamp, error))
    }
  }
};

module.exports = wsService